package com.emerquim.correo;

import java.util.Iterator;

import com.emerquim.bean.dao.ManejadorAlertasDAO;
import com.emerquim.bean.model.Evento;
import com.emerquim.bean.model.Paciente;

/**
 * Clase para manejar las alertas por corre del evento
 * @author Felipe Criales
 */
public class ManejadorAlertas {
	
	// -----------------------------------------------------
	// Constantes
	// -----------------------------------------------------
	/**
	 * Constante para el asunto de correo para los administradores
	 */
	public final static String ASUNTO_ADMIN = "Emerquim : Nuevo evento severidad grave";
	
	/**
	 * Constante para el asunto de correo para los medicos
	 */
	public final static String ASUNTO_MEDICO = "Emerquim: Nuevo evento severidad grave";
	
	/**
	 * Constante para el asunto de correo para los productores del agente
	 */
	public final static String ASUNTO_PRODUCTOR = "Emerquim: Nuevo evento toxicologico grave";
	
	// ----------------------------------------------------------
	// Atributos
	// ----------------------------------------------------------
	/**
	 * El evento a enviar las alertas
	 */
	private Evento evento;
	
	/**
	 * El correo que se va a enviar
	 */
	private Correo correo;
	
	/**
	 * Constructor por defecto
	 */
	public ManejadorAlertas(){
		
	}
	
	/**
	 * Constructor con parametros
	 * @param evento
	 */
	public ManejadorAlertas(Evento evento){
		this.evento = evento;
	}
	
	/**
	 * Metodo para enviar el correo de alerta
	 * Solo se envia los correos a las personas si la severidad del mismo es grave
	 */
	public void enviarCorreo(){
		if(evento.getSeveridad().equals("G")){
			Correo correo = new Correo();
			// 1. Enviar el correo a los administradores de la aplicacion
			this.enviarCorreoAdministradores(correo);
			// 2. Enviar los correos a los medicos de involucrados en el evento
			this.enviarCorreoMedicos(correo);
			// 3. Enviar los correos a las entidades involucradas en el evento
			this.enviarCorreoEntidades(correo);
		}
	}
	
	/**
	 * Enviar el correo a los administradores del sistema
	 * @correo El objeto con el manejador de correos
	 */
	private void enviarCorreoAdministradores(Correo correo){
		// 1. Definir los destinatarios del correo
		ManejadorAlertasDAO alertasDao = new ManejadorAlertasDAO();
		String[] destinatarios = alertasDao.getCorreosAdministradores();
		if(destinatarios != null){
			correo.setDestinatarios(destinatarios);
			correo.setAsuntoCorreo(this.ASUNTO_ADMIN);
			correo.setCuerpoCorreo("Emerquim le informa que se presento un nuevo evento con severidad GRAVE.\n\n" +
					datosGeneralesEvento() +				
					"\n\nAtentamente,\n\nEmerquim");
			correo.enviarCorreo();
		}
	}
	
	/**
	 * Enviar el correo a los administradores del sistema
	 * @correo El objeto con el manejador de correos
	 */
	private void enviarCorreoMedicos(Correo correo){
		Iterator<Paciente> itPacientes = evento.getPacientes().iterator();
		while(itPacientes.hasNext()){
			Paciente paciente = itPacientes.next();
			String[] datosMedico = paciente.getMedicoSeguimiento().split(",");
			ManejadorAlertasDAO alertasDao = new ManejadorAlertasDAO();
			String correoMedico = alertasDao.getCorreoMedico(Integer.parseInt(datosMedico[0]), Integer.parseInt(datosMedico[1]));
			if(correoMedico != null){
				String [] destinatarios = new String[1];
				destinatarios[0] = correoMedico;
				correo.setDestinatarios(destinatarios);
				correo.setAsuntoCorreo(this.ASUNTO_MEDICO);
				correo.setCuerpoCorreo("Emerquim le informa que se presento un nuevo evento con severidad GRAVE.\n\n" +
						"Ud. fue asignado como medico para tratar un paciente del evento.\n\n" +
						datosGeneralesEvento() +	
						"Nombre del paciente: " + paciente.getPrimerApellido() +" " + paciente.getSegundoApellido()+ "," +paciente.getPrimerNombre()+ " " + paciente.getSegundoNombre() +
						"\nEdad: " + paciente.getEdadString() +
						"\n\nAtentamente,\n\nEmerquim");
				correo.enviarCorreo();
			}
		}
	}
	
	/**
	 * Enviar el correo a los administradores del sistema
	 * @correo El objeto con el manejador de correos
	 */
	private void enviarCorreoEntidades(Correo correo){
		// TODO Correo entidades
	}
	
	/**
	 * Metodo que retorna los datos generales del evento
	 * @return
	 */
	private String datosGeneralesEvento(){
		return  "Los datos del eventos son:\n\nConsecutivo evento: " + evento.getId() + "\n" +
				"Numero de pacientes involucrados: " + evento.getPacientes().size() + "\n" + 
				"Fecha evento: " + evento.getFechaEventoString() + "\n" +
				"Descripcion del evento: " + evento.getDescripcion() + "\n";
	}

	public Evento getEvento() {
		return evento;
	}

	public void setEvento(Evento evento) {
		this.evento = evento;
	}

	public Correo getCorreo() {
		return correo;
	}

	public void setCorreo(Correo correo) {
		this.correo = correo;
	}
}
